package com.zyl.forkjoin;

import java.util.concurrent.RecursiveTask;

/**
 * @author zhaoyl
 * @date 2024/5/17 17:49
 * @description 说明
 * Fork/Join框架是Java 7提供的一种用于并行执行任务的框架，它将大任务分解为若干个小任务,
 * 并行执行这些小任务，最终通过合并每个小任务的结果得到大任务的结果。
 *
 * Fork/Join采用的是分而治之的基本思想，分而治之就是将一个复杂的任务，按照规定的阈值划分成多个简单的小任务，
 * 然后将这些小任务的结果再进行汇总返回，得到最终的任务。

 */
public class ForkjoinDemo extends RecursiveTask<Long> {
    private Long start;
    private Long end;
    //临界值
    private Long temp=1000L;

    //计算方法
    @Override
    protected Long compute() {
        //计算小于1000的值
        if ((end-start)<temp){
            Long sum =0L;
            for (Long i=start;i<=end;i++){
                sum +=i;
            }
            return sum;
        }else {
            //分支合并计算（这里拆开两个任务）
            long middle = (start+end)/2;//中间值
            ForkjoinDemo task1= new ForkjoinDemo(start,middle);
            task1.fork();//把拆分的任务压入队列
            ForkjoinDemo task2= new ForkjoinDemo(middle+1,end);
            task2.fork();//把拆分的任务压入队列
            return   task1.join()+task2.join();
        }
    }

    public ForkjoinDemo(Long start, Long end) {
        this.start = start;
        this.end = end;
    }
}
